﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AntikCompta.Data;
using System.Configuration;

namespace AntikCompta
{
    public partial class MainWindow : Form
    {
        private DataMng mDataMng;
        private Stock mStock;
        private Exercice mExercice;
        private bool mSaved;

        public MainWindow()
        {
            InitializeComponent();

            mDataMng = new DataMng();
            mDataMng.ExerciceChanged += new ExerciceChangedHandler(mDataMng_ExerciceChanged);

            mSaved = true;
            ChargerDonnees();            
        }

        private void ChargerDonnees()
        {
            String[] cmds = Environment.GetCommandLineArgs();
            if ( cmds.Length>1 )
            {
                String cmd = cmds[1];
                if (cmd.Length > 0)
                {
                    if (OuvrirDonnees(cmd))
                        Tools.SetConfig("DernierFichier", cmd);
                }
            }
            else
                LoadConfig();
        }

        private void LoadConfig()
        {
            String fichier;
            if (Tools.GetConfig("DernierFichier", out fichier))
                OuvrirDonnees(fichier);
        }

        void mDataMng_ExerciceChanged(object sender)
        {
            exerciceToolStripMenuItem.DropDownItems.Clear();

            foreach (Exercice e in mDataMng.ExerciceListe)
            {
                ToolStripMenuItem item = new ToolStripMenuItem();
                item.Text = e.Annee+"";
                item.Click += new EventHandler(item_Click);
                exerciceToolStripMenuItem.DropDownItems.Add(item);
            }
        }

        void item_Click(object sender, EventArgs e)
        {
            int annee = Convert.ToInt32(((ToolStripMenuItem)sender).Text);
            ActiverExercice(annee);           
        }

        private void quitterToolStripMenuItem_Click(object sender, EventArgs e)
        {           
            Application.Exit();
        }

        private void stockToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                OuvrirStock("Stock de fin de l'année " + mExercice.Annee, mExercice.Annee);
        }

        private void OuvrirStock(String aTitre, int aAnnee)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new StockWndViewer(aTitre, ref mStock, aAnnee));
        }

        private void ouvrirToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenFileDialog fd = new OpenFileDialog();
            if (fd.ShowDialog() == DialogResult.OK)
            {
                if( OuvrirDonnees(fd.FileName) )
                    Tools.SetConfig("DernierFichier", fd.FileName);
            }
        }

        private void EnableUI(bool aEnabled)
        {
            vuesToolStripMenuItem.Enabled = aEnabled;
            fraisToolStripMenuItem.Enabled = aEnabled;
            exerciceToolStripMenuItem.Enabled = aEnabled;
            journalToolStripMenuItem.Enabled = aEnabled;
            graphiquesToolStripMenuItem.Enabled = aEnabled;
            sauverToolStripMenuItem.Enabled = aEnabled;
        }

        private bool OuvrirDonnees(String aFichier)
        {
            Text = "Antik Compta";

            EnableUI(false);

            if (mDataMng.Charger(aFichier) == false)
                return false;
            
            mStock = new Stock(ref mDataMng);
            if (mStock == null)
                return false;

            CouleurLotMng.ChargerCouleurs();

            EnableUI(true);

            ActiverExercice(DateTime.Now.Year);

            return true;
        }

        private void ActiverExercice(int aAnnee)
        {
            if ( mExercice != null )
                mExercice.DataChanged -= new DataChangedHandler(mExercice_DataChanged);

            if (mDataMng.GetExercice(aAnnee, out mExercice))
            {
                Text = "Antik Compta : Exercice " + mExercice.Annee;
                mExercice.DataChanged += new DataChangedHandler(mExercice_DataChanged);

                if( mSaved == false )
                    Text += "*";
            }
        }

        void mExercice_DataChanged()
        {
            SetSavedStatus(false);
        }

        private void SetSavedStatus(bool aValue)
        {
            mSaved = aValue;

            if (aValue)
            {
                if (Text.IndexOf("*") != -1)
                    Text = Text.Replace("*", "");
            }
            else
            {
                if (Text.IndexOf("*") == -1)
                    Text += ("*");
            }
        }

        private void sauverToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Sauver();
        }

        private void Sauver()
        {
            if ((mDataMng.Fichier == null) || (mDataMng.Fichier.Length <= 0))
            {
                SaveFileDialog fd = new SaveFileDialog();
                if( fd.ShowDialog() == DialogResult.OK)
                    mDataMng.Sauver(fd.FileName);
            }
            else
                mDataMng.Sauver(mDataMng.Fichier);

            // sauvegarde des couleurs
            CouleurLotMng.SauverCouleurs();

            SetSavedStatus(true);
        }

        private void achatsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new AchatWnd(ref mStock, ref mExercice));
        }

        private void ventesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new VentesWnd(ref mDataMng, ref mStock, ref mExercice));
        }

        private void Ouvrir(Form aWnd)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
            {
                aWnd.MdiParent = this;
                aWnd.Show();
            }
        }

        private void nouveauToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Exercice newExercice = new Exercice();
            NewExercice wnd = new NewExercice(ref mDataMng, ref newExercice);
            if (wnd.ShowDialog() == DialogResult.OK)
            {
                mExercice = newExercice;
                if (mDataMng.AjouterExercice(mExercice) == true)
                {
                    Text = "Antik Compta : Exercice " + mExercice.Annee;
                    SetSavedStatus(false);
                    OuvrirStock("Stock de l'année " + mExercice.Annee , mExercice.Annee);
                }
            }
        }

        private void billanToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new BilanWnd(ref mDataMng, ref mExercice));
        }

        private void synthèseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new Synthese(ref mDataMng, ref mExercice));
        }

        private void gestionDesFraisToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new FraisWnd(ref mExercice));
        }

        private void livreDeCaisseToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                Ouvrir(new CaisseWnd(ref mDataMng, ref mStock, ref mExercice));
        }

        private void MainWindow_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (mSaved == false)
            {
                if (MessageBox.Show("Tu as oublié de sauver tes modifications.\nVeux tu sauver?", "Attention", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    Sauver();
            }
            
            mDataMng.ExerciceChanged -= new ExerciceChangedHandler(mDataMng_ExerciceChanged);

            if( mExercice != null )
                mExercice.DataChanged -= new DataChangedHandler(mExercice_DataChanged);
        }

        private void stockDeDebutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (mExercice == null)
                MessageBox.Show("Aucun exercice ouvert");
            else
                OuvrirStock("Stock de début de l'année " + mExercice.Annee, mExercice.Annee - 1);
        }

        private void calculatriceToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Ouvrir(new CalcWnd());
        }

        private void journalToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Ouvrir(new JournalWnd(mDataMng.Journal));
        }

        private void graphiquesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Ouvrir(new GraphWnd(mDataMng, mStock));
        }

        private void importerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String fichier;
            Tools.GetConfig("DernierFichier", out fichier);
            Import wnd = new Import(fichier);
            wnd.ShowDialog(this);
            if (wnd.ImportOk)
            {
                if (OuvrirDonnees(wnd.Fichier))
                    Tools.SetConfig("DernierFichier", wnd.Fichier);
            }
        }
    }
}
